package com.atguigu.java;

/**
 * 使用同步方法处理继承Thread类的方式中的线程安全问题
 *
 *
 *  关于同步方法的总结：
 *  1. 同步方法任然涉及到同步监视器，只是不需要我们显示声明
 *  2. 非静态的同步方法，同步监视器是：this
 *     静态的同步方法：同步监视器是：当前类本身
 *  3.是继承类，就要static
 */
class Window4 extends Thread {

    private static int ticket = 100;

    @Override
    public void run() {
        while (true) {

            show();
        }
    }

    public static synchronized void show() {//同步监视器:Window4.class
//    public synchronized void show() {//同步监视器:t1,t2,t3 ;解决方法错误
        try {
            Thread.currentThread().sleep(100);
        } catch (
                InterruptedException e) {
            throw new RuntimeException(e);
        }
        if (ticket > 0) {
            System.out.println(Thread.currentThread().getName() + "买票，票号为：" + ticket);
            ticket--;
        }
    }
}


public class WindowTest4 {
    public static void main(String[] args) {
        Window4 t1 = new Window4();
        Window4 t2 = new Window4();
        Window4 t3 = new Window4();


        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");

        t1.start();
        t2.start();
        t3.start();
    }
}
